package utils;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;

/**
 * 七牛云工具类
 *
 * 使用七牛云提供的Java SDK来实现图片的删除，上传
 *
 * Java SDK的所有的功能，都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access Key和Secret Key
 *
 * 客户端上传前需要先从服务端获取上传凭证，并在上传资源时将上传凭证作为请求内容的一部分。
 *
 * 服务端直传是指客户利用七牛服务端SDK从服务端直接上传文件到七牛云，交互的双方一般都在机房里面，
 * 所以服务端可以自己生成上传凭证，然后利用SDK中的上传逻辑进行上传，最后从七牛云获取上传的结果，
 * 这个过程中由于双方都是业务服务器，所以很少利用到上传回调的功能，而是直接自定义returnBody来获取自定义的回复内容。
 * */
public class QiniuUtils {
    /**
     * 上传凭证,默认不指定key的情况下，以文件内容的hash值作为文件名
     */
    public  static String accessKey = "vXloO0w8w-1im5vvsYxqHnRFh34wR492wr29-_F3";
    public  static String secretKey = "rciM0Bg76NfChHT-BJLrWjkSInp3oxRLbCyZkc8D";
    public  static String bucket = "xwltest1";//存储空间的名称
    
    /**
     * 本地文件上传
     */
    public static boolean upload2Qiniu(String filePath,String fileName){
        /**
         * 存储支持空间创建在不同的机房，在使用Java SDK中的UploadManager上传文件之前，
         * 必须要构建一个上传用的Configuration对象，在该对象中，可以指定空间对应的Region以及其他的一些影响上传的参数。
         */
        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(Zone.zone2());
        UploadManager uploadManager = new UploadManager(cfg);
        //默认不指定key的情况，以文件内容的hash值作为文件名
        String key = null;
        
        Auth auth = Auth.create(accessKey,secretKey);
        String upToken = auth.uploadToken(bucket);
    
        try {
            Response response = uploadManager.put(filePath,fileName,upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println("putRet.key:" + putRet.key);
            System.out.println("putRet.hash: " + putRet.hash);
            return true;
        } catch (QiniuException e) {
            Response r = e.response;
            System.err.println(r.toString());
        }
        return false;
    }
    
    /**
     * 内存中的字节数组上传
     */
    public static boolean upload2Qiniu(byte[] bytes,String fileName){
        //构造一个带有Zone对象的配置类
        /**
         * 华东：–：z0–zone0
         * 华北：–：z1–zone1
         * 华南：–：z2–zone2
         */
        Configuration cfg = new Configuration(Zone.zone2());
        //其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //默认不指定key的情况，以文件内容的hash值作为文件名
        String key = fileName;
     
        Auth auth = Auth.create(accessKey,secretKey);
        String upToken = auth.uploadToken(bucket);
        
        try {
            Response response = uploadManager.put(bytes,key,upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(),DefaultPutRet.class);
            
            System.out.println("putRet.key:" + putRet.key);
            System.out.println("putRet.hash:" + putRet.hash);
            return true;
        } catch (QiniuException e) {
            
            Response r = e.response;
            System.err.println(r.toString());
        }
        return false;
    }
    
    /**
     * 删除七牛云空间中的文件
     */
    public static boolean deleteFileFromQiniu(String fileName){
        System.out.println("进入到七牛云工具类删除方法=========");
        //构造一个带指定Zone对象的配置类
        /**
         * 华东：–：z0–zone0
         * 华北：–：z1–zone1
         * 华南：–：z2–zone2
         */
        Configuration cfg = new Configuration(Zone.zone2());
        String key = fileName;
        
        Auth auth = Auth.create(accessKey,secretKey);
        BucketManager bucketManager = new BucketManager(auth,cfg);
        
        try{
            bucketManager.delete(bucket, key);
            System.out.println("已经删除图片：==============" + fileName);
            return true;
        }catch (QiniuException ex){
            //如果遇到异常，说明删除失败
            System.out.println("删除方法遇到异常============");
            System.err.println(ex.code());
            System.err.println(ex.response.toString());
        }
        return false;
    }
}
